package br.ufpe.cin.rgms.base.publicacao.controller;

import java.util.List;

import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;
#if($linhaPesquisa)
import br.ufpe.cin.rgms.base.linhapesquisa.dao.LinhaPesquisaDAO;
#end
import br.ufpe.cin.rgms.base.membro.dao.MembroDAO;
import br.ufpe.cin.rgms.base.membro.model.Membro;
import br.ufpe.cin.rgms.base.publicacao.dao.PublicacaoDAO;
import br.ufpe.cin.rgms.base.publicacao.model.Publicacao;

@Resource
public class PublicacaoController {

	private PublicacaoDAO dao;
	#if($linhaPesquisa)
	private LinhaPesquisaDAO linhaDAO;
	#end
	private MembroDAO membroDao;
	private Result result;
	private Validator validator;

	public PublicacaoController(PublicacaoDAO dao,
								#if($linhaPesquisa)
								LinhaPesquisaDAO linhaDAO,
								#end
			MembroDAO membroDAO, Result result, Validator validator) {
		this.dao = dao;
		#if($linhaPesquisa)
		this.linhaDAO = linhaDAO;
		#end
		this.result = result;
		this.validator = validator;
		this.membroDao = membroDAO;
	}

	public void form() {
		#if($linhaPesquisa)
		result.include("linhaPesquisaList", linhaDAO.findAll());
		#end
		result.include("membroList", membroDao.findAll());
	}

	public Publicacao edita(Publicacao publicacao) {
		#if($linhaPesquisa)
		result.include("linhaPesquisaList", linhaDAO.findAll());
		#end
		result.include("membroList", membroDao.findAll());
		return dao.carrega(publicacao.getId());
	}

	public void altera(Publicacao publicacao) {
		validaCamposObrigatorios(publicacao);
		validator.onErrorUsePageOf(this).edita(publicacao);

		dao.altera(publicacao);
		result.include("mensagem", "publicacao_alterada");
		result.redirectTo(this).index(null);
	}

	public List<Publicacao> index(Publicacao publicacao) {
		List<Publicacao> publicacoes = null;

		publicacoes = dao.findAllByFilter(publicacao);
		if (publicacoes.isEmpty()) {
			result.include("mensagem", "publicacao_nao_encontrada");
		}

		return publicacoes;
	}

	public void adiciona(final Publicacao publicacao, final List<String> membros) {
		if (publicacao != null) {
			validaCamposObrigatorios(publicacao);
			validator.onErrorUsePageOf(this).form();

			dao.salva(publicacao);

			if (membros != null) {
				for (String id : membros) {
					Membro membro = membroDao.carrega(Integer.parseInt(id));
					membro.getPublicacoes().add(publicacao);
					membroDao.altera(membro);
				}
			}

			result.include("mensagem", "publicacao_inserida");
			result.redirectTo(this).index(null);
		}
	}

	private void validaCamposObrigatorios(Publicacao publicacao) {
		if (publicacao.getTitulo().isEmpty()) {
			validator.add(new ValidationMessage("erro",
					"publicacao_titulo_branco"));
		}
		if (publicacao.getAno().isEmpty()) {
			validator.add(new ValidationMessage("erro", "publicacao_ano_branco"));
		}
		// if (publicacao.getAutores().isEmpty()) {
		// validator.add(new ValidationMessage("erro",
		// "publicacao_ano_branco"));
		// }
	}

	public Publicacao detalhe(Integer id) {
		Publicacao pub = dao.carrega(id);
		
		result.include("membroList", membroDao.findByPublication(id));
		#if($linhaPesquisa)
		if(pub.getLinhaPesquisa()!=null){
			result.include("linhaPesquisa", linhaDAO.carrega(pub.getLinhaPesquisa().getId()));
		}
		#end
		
		return pub;
	}

	public void remove(Publicacao publicacao) {
		if (publicacao != null) {
			publicacao = dao.carrega(publicacao.getId());
			dao.delete(publicacao);
			result.include("mensagem", "publicacao_excluida");
		}

		result.redirectTo(this).index(null);
	}

}
